package com.hellohu.mbg.plugin;

import org.apache.commons.lang3.StringUtils;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 从属性中读取映射关系，并覆盖默认映射关系
 *
 * @author hellohu
 */
public class PropertiesReplaceTypeResolverDefaultImpl extends JavaTypeResolverDefaultImpl {

    public PropertiesReplaceTypeResolverDefaultImpl() {
        super();

    }

    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        //先使用反射获取Type的所有static字段的名字和值
        Map<String, Integer> typeMap = getTypeMap();
        //存在PACKAGE_PREFIX.XXX的配置，则覆盖原来的配置
        for (Map.Entry<String, Integer> e : typeMap.entrySet()) {
            String property = this.properties.getProperty(e.getKey(), null);
            if (StringUtils.isNotBlank(property)) {
                super.typeMap.put(e.getValue(), new JdbcTypeInformation(e.getKey(),
                        new FullyQualifiedJavaType(property)));
            }
        }
    }

    /**
     * 获取java.sql.Types这个常量类的的常量属性名和值的map
     *
     * @return 常量map
     */
    private Map<String, Integer> getTypeMap() {
        Field[] fields = Types.class.getFields();
        Map<String, Integer> typeMap = new HashMap<>();
        try {
            for (Field f : fields) {
                if (Modifier.isStatic(f.getModifiers()) && Modifier.isFinal(f.getModifiers())
                        && f.getType().equals(int.class)) {
                    typeMap.put(f.getName(), f.getInt(Types.class));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("反射获取Type的类型常亮失败", e);
        }
        return typeMap;
    }


}
